﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.ComponentModel;

namespace TARLib
{
    public class ProdottoOrdinatoCollection : BindingList<ProdottoOrdinato>// IList<ProdottoOrdinato>
    {
        //private List<ProdottoOrdinato> _InternalList;

        public ProdottoOrdinatoCollection()
        {
            // _InternalList = new List<ProdottoOrdinato>();
        }

        public ProdottoOrdinatoCollection(List<ProdottoOrdinato> list)
        {
            foreach (ProdottoOrdinato po in list)
            {
                this.Add(po);
            }
        }

        public void CaricaDaComandaID(int comandaID)
        {
            SqlConnection conn = new SqlConnection(Database.GetDBConnectionString());
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = conn;
            cmd.CommandText = "[Cucina].[SP_ProdottiComandaByComanda_CL]";
            cmd.CommandType = System.Data.CommandType.StoredProcedure;
            cmd.Parameters.Add(new SqlParameter("@ComandaID", System.Data.SqlDbType.Int) { Value = comandaID });

            SqlDataReader dr = null;
            try
            {
                conn.Open();
                dr = cmd.ExecuteReader();

                while (dr.Read())
                {
                    this.Add(new ProdottoOrdinato(
                        (int)dr["ProdottoID"],
                        dr["Nome"].ToString(),
                        dr["NomeBreve"].ToString(),
                        null,
                        (decimal)dr["PrezzoVendita"],
                        dr["Note"] == DBNull.Value ? null : dr["Note"].ToString(),
                        (decimal)dr["PrezzoVendita"],
                        new PuntoDistribuzione(
                            (int)dr["PuntoDistribuzioneID"],
                            dr["PuntoDistribuzioneDesc"].ToString(),
                            (bool)dr["IsCheckInRichiesto"],
                            (bool)dr["IsStampaRemotaRichiesta"],
                            (bool)dr["IsConsegnaRichiesta"],
                            (bool)dr["IsTavoloRichiesto"],
                            dr["PathStampante"] == DBNull.Value ? null : dr["PathStampante"].ToString(),
                            (int)dr["VelocitaWidthFinestraSecondi"],
                            (int)dr["VelocitaNSuddivisioni"],
                            (int)dr["VelocitaLeftSkipPercentage"],
                            (int)dr["VelocitaRightSkipPercentage"],
                            (int)dr["GracePeriodStampaSecondi"],
                            dr["VelocitaFissaProdottiOra"] == DBNull.Value ? null : (int?)dr["VelocitaFissaProdottiOra"]),
                        dr["Barcode"] == DBNull.Value ? null : dr["Barcode"].ToString(),
                        false,
                        (int)dr["PercentualeVassoio"]));
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (dr != null)
                {
                    dr.Close();
                    dr.Dispose();
                }
                cmd.Dispose();
                conn.Close();
                conn.Dispose();
            }
        }

        public void CaricaDaVassoioID(int vassoioID)
        {
            SqlConnection conn = new SqlConnection(Database.GetDBConnectionString());
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = conn;
            cmd.CommandText = "[Cucina].[SP_ProdottiVassoioByVassoioID_CL]";
            cmd.CommandType = System.Data.CommandType.StoredProcedure;
            cmd.Parameters.Add(new SqlParameter("@VassoioID", System.Data.SqlDbType.Int) { Value = vassoioID });

            SqlDataReader dr = null;
            try
            {
                conn.Open();
                dr = cmd.ExecuteReader();

                while (dr.Read())
                {
                    this.Add(new ProdottoOrdinato(
                        (int)dr["ProdottoID"],
                        dr["Nome"].ToString(),
                        dr["NomeBreve"].ToString(),
                        null,
                        (decimal)dr["PrezzoVendita"],
                        dr["Note"] == DBNull.Value ? null : dr["Note"].ToString(),
                        (decimal)dr["PrezzoVendita"],
                        new PuntoDistribuzione(
                            (int)dr["PuntoDistribuzioneID"],
                            dr["PuntoDistribuzioneDesc"].ToString(),
                            (bool)dr["IsCheckInRichiesto"],
                            (bool)dr["IsStampaRemotaRichiesta"],
                            (bool)dr["IsConsegnaRichiesta"],
                            (bool)dr["IsTavoloRichiesto"],
                            dr["PathStampante"] == DBNull.Value ? null : dr["PathStampante"].ToString(),
                            (int)dr["VelocitaWidthFinestraSecondi"],
                            (int)dr["VelocitaNSuddivisioni"],
                            (int)dr["VelocitaLeftSkipPercentage"],
                            (int)dr["VelocitaRightSkipPercentage"],
                            (int)dr["GracePeriodStampaSecondi"],
                            dr["VelocitaFissaProdottiOra"] == DBNull.Value ? null : (int?)dr["VelocitaFissaProdottiOra"]),
                        dr["Barcode"] == DBNull.Value ? null : dr["Barcode"].ToString(),
                        false,
                        (int)dr["PercentualeVassoio"]));
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (dr != null)
                {
                    dr.Close();
                    dr.Dispose();
                }
                cmd.Dispose();
                conn.Close();
                conn.Dispose();
            }
        }

        public void SalvaByComandaID(int comandaID, SqlTransaction trans)
        {
            // Non è supportata la procedura di update, il salvataggio della collection
            // prevede la cancellazione di tutti gli elementi e il successivo re-inserimento
            SqlCommand cmd = new SqlCommand();
            cmd.Transaction = trans;
            cmd.Connection = trans.Connection;
            cmd.CommandText = "[Cucina].[SP_ProdottiComanda_DA]";
            cmd.CommandType = System.Data.CommandType.StoredProcedure;
            cmd.Parameters.Add(new SqlParameter("@ComandaID", System.Data.SqlDbType.Int) { Value = comandaID });
            try
            {
                cmd.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                throw ex;
            }

            foreach (ProdottoOrdinato p in this.Items)
            {
                p.SalvaByComandaID(comandaID, trans);
            }
        }

        //#region ICollection<ProdottoOrdinato> Members

        //public void Add(ProdottoOrdinato item)
        //{
        //    _InternalList.Add(item);
        //}

        //void item_PrenotazioneCompletata(object sender, MessaggioEventArgs args)
        //{
        //    // (ProdottoOrdinato)sender
        //}

        //void item_PrenotazioneAnnullata(object sender, MessaggioEventArgs args)
        //{
        //    throw new NotImplementedException();
        //}

        //public void Clear()
        //{
        //    _InternalList.Clear();
        //}

        //public bool Contains(ProdottoOrdinato item)
        //{
        //    return _InternalList.Contains(item);
        //}

        //public void CopyTo(ProdottoOrdinato[] array, int arrayIndex)
        //{
        //    _InternalList.CopyTo(array, arrayIndex);
        //}

        //public int Count
        //{
        //    get { return _InternalList.Count; }
        //}

        //public bool IsReadOnly
        //{
        //    get { return ((IList<ProdottoOrdinato>)_InternalList).IsReadOnly; }
        //}

        //public bool Remove(ProdottoOrdinato item)
        //{
        //    return _InternalList.Remove(item);
        //}

        //#endregion

        //#region IEnumerable<ProdottoOrdinato> Members

        //public IEnumerator<ProdottoOrdinato> GetEnumerator()
        //{
        //    return _InternalList.GetEnumerator();
        //}

        //#endregion

        //#region IEnumerable Members

        //System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
        //{
        //    return _InternalList.GetEnumerator();
        //}

        //#endregion

        //#region IList<ProdottoOrdinato> Members

        //public int IndexOf(ProdottoOrdinato item)
        //{
        //    return _InternalList.IndexOf(item);
        //}

        //public void Insert(int index, ProdottoOrdinato item)
        //{
        //    _InternalList.Insert(index, item);
        //}

        //public void RemoveAt(int index)
        //{
        //    _InternalList.RemoveAt(index);
        //}

        //public ProdottoOrdinato this[int index]
        //{
        //    get
        //    {
        //        return _InternalList[index];
        //    }
        //    set
        //    {
        //        _InternalList[index] = value;
        //    }
        //}

        //#endregion

        public void SalvaByVassoioID(int vassoioID, SqlTransaction trans)
        {
            foreach (ProdottoOrdinato p in this.Items)
            {
                p.SalvaByVassoioID(vassoioID, trans);
            }
        }
    }
}
